package com.atguigu.gmall.ums.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.ums.mapper.UserMapper;
import com.atguigu.gmall.ums.entity.UserEntity;
import com.atguigu.gmall.ums.service.UserService;


@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<UserEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<UserEntity>()
        );

        return new PageResultVo(page);
    }

    @Override
    public Boolean check(String data, Integer type) {
        //判断是哪个数据进行占用的查询
        LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();
        switch (type){
            case 1: //账号
                queryWrapper.eq(UserEntity::getUsername , data);
                break;
            case 2: //手机号码
                queryWrapper.eq(UserEntity::getPhone , data);
                break;
            case 3: // email
                queryWrapper.eq(UserEntity::getEmail , data);
                break;
            default:
                return null;
        }

        //使用 data在数据库用户表中查询记录条数  如果>0代表被占用   ==0代表没被占用
        return baseMapper.selectCount(queryWrapper) == 0 ;
    }

    @Override
    public Boolean register(UserEntity userEntity, String code) {
        //1、检查参数是否正确(为了防止空指针)
        if(StringUtils.isEmpty(userEntity.getUsername())||
                StringUtils.isEmpty(userEntity.getPhone())||
                StringUtils.isEmpty(userEntity.getPassword())||
                StringUtils.isEmpty(userEntity.getEmail())){
            return false;
        }
        //ALTER TABLE ums_user ADD UNIQUE KEY  uk_username  (username);
        //2、判断 验证码是否正确[  从redis中获取当前userEntity phone对应的验证码缓存，和code参数进行比较 ]
        //3、对userEntity的密码进行加密
        //使用每个用户自己的盐对用户密码进行加密
        String salt = UUID.randomUUID().toString().replace("-" , "").substring(0,8);
        userEntity.setSalt(salt);
        //使用MD5方式  对密码+盐  进行加密(md5不可逆加密)
        userEntity.setPassword(DigestUtils.md5Hex(salt+DigestUtils.md5Hex(userEntity.getPassword())));
        //4、需要将数据库需要的前端没有提交的数据 初始化设置
        userEntity.setNickname(userEntity.getUsername());
        userEntity.setStatus(1);
        userEntity.setLevelId(1L);
        userEntity.setIntegration(10000);
        userEntity.setGrowth(100000);
        userEntity.setCreateTime(new Date());
        //5、从redis中删除缓存的注册验证码
        return this.save(userEntity);
    }

    @Override
    public UserEntity queryUser(String loginName, String password) {
        //登录账号 和数据库的 username  phone  email任意一个匹配  账号正确
        UserEntity userEntity = this.getOne(new LambdaQueryWrapper<UserEntity>().eq(UserEntity::getUsername, loginName)
                .or()
                .eq(UserEntity::getPhone, loginName)
                .or()
                .eq(UserEntity::getEmail, loginName)
        );
        if(userEntity==null){
            return null;//账号错误
        }
        //用户登录时的密码是明文的
        //数据库中的密码经过加盐 加密后存储的
        //比较密码时需要使用 账号查询数据库中该用户的盐 ，使用明文密码和盐组合加密 再和数据库查询到的密文密码进行比较
        String salt = userEntity.getSalt();
        //对登录的明文密码 使用盐加密：必须和注册时加密的方式一模一样
        String decodePwd = DigestUtils.md5Hex(salt + DigestUtils.md5Hex(password));
        if(!decodePwd.equals(userEntity.getPassword())){
            return null;//密码错误
        }
        //查询成功
        return userEntity;
    }

}